package GestorCitas;

/**
 * @file CitaDAO.java
 * @brief Implementa la clase CitaDAO.java
 * 
 * Implementa la clase CitaDAO usada para manejar la información de
 * las citas del sistema en la base de datos.
 * 
 * @author Víctor Martínez Gómez, revisado por Miguel Ángel Díaz López y Antonio M. Gutierrez Martinez
 * @version 02.01
 * 
 */

import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

import GestorUsuarios.IDException;
import GestorUsuarios.Usuario;
import Servicios.Conexion;

/**
 * @class CitaDAO
 * 
 * @brief Se encarga de realizar las operaciones para manejar la información de
 *        las citas del sistema en la base de datos.
 * 
 *        Se encarga de realizar las operaciones para manejar la información de
 *        las citas del sistema. Permite realizar búsquedas, añadirlas a la base
 *        de datos, etc.
 * 
 */

public class CitaDAO {

	/**
	 * @brief Cadenas relacionadas con el estado
	 */
	private static final String ESTADO_PENDIENTE = "p";
	private static final String ESTADO_EN_CURSO = "e";
	private static final String ESTADO_CANCELADA = "c";
	private static final String ESTADO_FINALIZADA = "f";
	private static final String ESTADO_NO_LLEVADA_A_CABO = "n";

	/**
	 * @brief Agrega el objeto Cita a la BD
	 * @param cita
	 *            Cita a agregar
	 * @throws ClassNotFoundException
	 *             , IOException, SQLException, IDException
	 */
	public static void add(Cita cita) throws SQLException, IOException,
			ClassNotFoundException, IDException {
		DateFormat formatoFecha = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

		String estado;
		if (cita.getEstado() == EstadoCita.PENDIENTE)
			estado = ESTADO_PENDIENTE;
		else if (cita.getEstado() == EstadoCita.EN_CURSO)
			estado = ESTADO_EN_CURSO;
		else if (cita.getEstado() == EstadoCita.CANCELADA)
			estado = ESTADO_CANCELADA;
		else if (cita.getEstado() == EstadoCita.FINALIZADA)
			estado = ESTADO_FINALIZADA;
		else
			estado = ESTADO_NO_LLEVADA_A_CABO;

                String observaciones="";
                if (cita.getObservaciones() != null )
                    observaciones = "\'" + cita.getObservaciones() + "\'";
                else
                    observaciones = "\'\'";

		Conexion.conectar();
		Conexion
				.actualizar("INSERT Cita(fechaCita,fechaFinalizacion,estado,observaciones,idUsuario,idMedico,idCentroMedico) VALUES (+"
						+ "\'"
						+ formatoFecha.format(cita.getFechaCita())
						+ "\', \'"
						+ formatoFecha.format(cita.getFechaFinalizacion())
						+ "\', \'"
						+ estado
						+ "\',"
                                                + observaciones
                                                +" ,\'"
						+ cita.getIdPaciente()
						+ "\', \'"
						+ cita.getIdMedico()
						+ "\', \'"
						+ cita.getIdCentro() + "\');");
		// Buscamos por login, que es único
		Cita[] cita_bd = get(cita.getFechaCita(), cita.getFechaFinalizacion(),
				cita.getEstado(), cita.getIdPaciente(), cita.getIdMedico(),
				cita.getIdCentro());
		Conexion.desconectar();
		// Establecemos el id asignado en la base de datos
		if (cita_bd == null) {
			throw new IDException();
		}
		cita.setIdCita(cita_bd[0].getIdCita());
	}

	/**
	 * @brief Obtiene el objeto Cita con id de la BD
	 * @param id
	 *            id del objeto a buscar
	 * @throws ClassNotFoundException
	 *             , IOException, SQLException, IDException,
	 *             NoSuchAlgorithmException
	 */
	public static Cita get(int id) throws SQLException, IOException,
			ClassNotFoundException {
		DateFormat formatoFecha = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Cita cita = null;
		Conexion.conectar();
		ResultSet tabla = Conexion
				.consultar("SELECT * FROM Cita WHERE Cita.idCita = " + id + ";");
		if (tabla.next()) { // Encontrado
			String string_estado = tabla.getString("estado");
			EstadoCita estado_cita;
			if (string_estado.equals(ESTADO_PENDIENTE))
				estado_cita = EstadoCita.PENDIENTE;
			else if (string_estado.equals(ESTADO_EN_CURSO))
				estado_cita = EstadoCita.EN_CURSO;
			else if (string_estado.equals(ESTADO_CANCELADA))
				estado_cita = EstadoCita.CANCELADA;
			else if (string_estado.equals(ESTADO_FINALIZADA))
				estado_cita = EstadoCita.FINALIZADA;
			else
				estado_cita = EstadoCita.NO_LLEVADA_A_CABO;

			try {
				cita = new Cita(tabla.getInt("idCita"), formatoFecha.parse(tabla.getString("fechaCita")),
						formatoFecha.parse(tabla.getString("fechaFinalizacion")), estado_cita,
                                                tabla.getString("observaciones"),tabla.getInt("idUsuario"), tabla.getInt("idMedico"),
						tabla.getInt("idCentroMedico"));
			} catch (ParseException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} else {
			cita = null;
		}
		Conexion.desconectar();
		return cita;
	}

	/**
	 * @brief Obtiene el objeto Cita con parámetros de la BD
	 * @throws ClassNotFoundException
	 *             , IOException, SQLException, IDException,
	 *             NoSuchAlgorithmException
	 */
	public static Cita[] get(Date fechaCita, Date fechaFinalizacion,
			EstadoCita estado, Integer idPaciente, Integer idMedico,
			Integer idCentro) throws SQLException, IOException,
			ClassNotFoundException {
		DateFormat formatoFecha = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Cita[] citas = null;
		Conexion.conectar();

		String estadoCita = null;
		if (estado == EstadoCita.PENDIENTE)
			estadoCita = ESTADO_PENDIENTE;
		else if (estado == EstadoCita.EN_CURSO)
			estadoCita = ESTADO_EN_CURSO;
		else if (estado == EstadoCita.CANCELADA)
			estadoCita = ESTADO_CANCELADA;
		else if (estado == EstadoCita.FINALIZADA)
			estadoCita = ESTADO_FINALIZADA;
		else if (estado == EstadoCita.NO_LLEVADA_A_CABO)
			estadoCita = ESTADO_NO_LLEVADA_A_CABO;

		String parte_sel = "WHERE ";
		if (fechaCita != null)
			parte_sel += "fechaCita >= \'" + formatoFecha.format(fechaCita)
					+ "\' AND ";
		if (fechaFinalizacion != null)
			parte_sel += "fechaFinalizacion <= \'"
					+ formatoFecha.format(fechaFinalizacion) + "\' AND ";
		if (estado != null)
			parte_sel += "estado = \'" + estadoCita + "\' AND ";
		if (idPaciente != null)
			parte_sel += "idUsuario = " + idPaciente + " AND ";
		if (idMedico != null)
			parte_sel += "idMedico = " + idMedico + " AND ";
		if (idCentro != null)
			parte_sel += "idCentroMedico = " + idCentro + " AND ";

		// Sustituimos coma final, por punto y coma
		parte_sel = parte_sel.substring(0, parte_sel.length() - 4) + ";";
		
		ResultSet tabla;
		if (fechaCita == null && fechaFinalizacion == null && estado == null
				&& idPaciente == null && idMedico == null && idCentro == null)
			tabla = Conexion.consultar("SELECT * FROM Cita;");
		else
			tabla = Conexion.consultar("SELECT * FROM Cita " + parte_sel);
                
		ArrayList<Cita> list_citas = new ArrayList<Cita>();
		while (tabla.next()) {
			String string_estado = tabla.getString("estado");
			EstadoCita estado_cita;
			if (string_estado.equals(ESTADO_PENDIENTE))
				estado_cita = EstadoCita.PENDIENTE;
			else if (string_estado.equals(ESTADO_EN_CURSO))
				estado_cita = EstadoCita.EN_CURSO;
			else if (string_estado.equals(ESTADO_CANCELADA))
				estado_cita = EstadoCita.CANCELADA;
			else if (string_estado.equals(ESTADO_FINALIZADA))
				estado_cita = EstadoCita.FINALIZADA;
			else
				estado_cita = EstadoCita.NO_LLEVADA_A_CABO;

			try {
				list_citas
						.add(new Cita(tabla.getInt("idCita"),formatoFecha.parse(tabla.getString("fechaCita")), formatoFecha.parse(tabla.getString("fechaFinalizacion")),
                                                estado_cita, tabla.getString("observaciones"), tabla.getInt("idUsuario"), tabla.getInt("idMedico"),
						tabla.getInt("idCentroMedico")));
			} catch (ParseException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		Conexion.desconectar();

		if (list_citas.size() > 0) {
			citas = new Cita[list_citas.size()];
			list_citas.toArray(citas);
			return citas;
		} else
			return null;
	}

	/**
	 * @brief Actualiza la información asociada al objeto Cita
	 * @param cita
	 *            Cita a actualizar
	 * @throws ClassNotFoundException
	 *             , IOException, SQLException
	 */
	public static void update(Cita cita) throws SQLException, IOException,
			ClassNotFoundException {
		DateFormat formatoFecha = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String estadoCita;
		if (cita.getEstado() == EstadoCita.PENDIENTE)
			estadoCita = ESTADO_PENDIENTE;
		else if (cita.getEstado() == EstadoCita.EN_CURSO)
			estadoCita = ESTADO_EN_CURSO;
		else if (cita.getEstado() == EstadoCita.CANCELADA)
			estadoCita = ESTADO_CANCELADA;
		else if (cita.getEstado() == EstadoCita.FINALIZADA)
			estadoCita = ESTADO_FINALIZADA;
		else
			estadoCita = ESTADO_NO_LLEVADA_A_CABO;

                String observaciones;
                if (cita.getObservaciones() != null )
                    observaciones = cita.getObservaciones();
                else
                    observaciones = "";
                
		Conexion.conectar();
		Conexion.actualizar("UPDATE Cita SET fechaCita=\'"
				+ formatoFecha.format(cita.getFechaCita())
				+ "\', fechaFinalizacion = \'"
				+ formatoFecha.format(cita.getFechaFinalizacion())
				+ "\', estado = \'" + estadoCita
                                + "\', observaciones = \'" + observaciones
                                + "\', idUsuario = \'"
				+ cita.getIdPaciente() + "\', idMedico = \'"
				+ cita.getIdMedico() + "\', idCentroMedico = \'"
				+ cita.getIdCentro() + "\' WHERE idCita=" + cita.getIdCita()
				+ ";");

		Conexion.desconectar();
	}
}
